#ifndef __WIZ_ARCHIVE_HPP__SHANHAOBO_19800429__
#define __WIZ_ARCHIVE_HPP__SHANHAOBO_19800429__

#include "../Accessor/WizAccessor.hpp"

namespace Wiz
{
    namespace Archive
    {
        namespace Category
        {
            enum Type
            {
                eInput,
                eOutput
            };
            WIZ_DECLARE(::Wiz::Archive::Category::Type);
        } /// end of namespace Category
        struct Type
        {
            WIZ_DECLARE_CLASS_THIS(Type);

            ///===================================///
            virtual tThisRef operator&&(::Wiz::Boolean8::InOut)    = 0;
            virtual tThisRef operator&&(::Wiz::Boolean16::InOut)   = 0;
            virtual tThisRef operator&&(::Wiz::Boolean32::InOut)   = 0;
            virtual tThisRef operator&&(::Wiz::Boolean64::InOut)   = 0;

            virtual tThisRef operator&&(::Wiz::Int8::InOut)        = 0;
            virtual tThisRef operator&&(::Wiz::Int16::InOut)       = 0;
            virtual tThisRef operator&&(::Wiz::Int32::InOut)       = 0;
            virtual tThisRef operator&&(::Wiz::Int64::InOut)       = 0;

            virtual tThisRef operator&&(::Wiz::UInt8::InOut)       = 0;
            virtual tThisRef operator&&(::Wiz::UInt16::InOut)      = 0;
            virtual tThisRef operator&&(::Wiz::UInt32::InOut)      = 0;
            virtual tThisRef operator&&(::Wiz::UInt64::InOut)      = 0;

            virtual tThisRef operator&&(::Wiz::Real16::InOut)      = 0;
            virtual tThisRef operator&&(::Wiz::Real32::InOut)      = 0;
            virtual tThisRef operator&&(::Wiz::Real64::InOut)      = 0;

            virtual tThisRef operator&&(::Wiz::String::InOut)      = 0;
            virtual tThisRef operator&&(::Wiz::WString::InOut)     = 0;
            virtual tThisRef operator&&(::Wiz::UTF8::String::InOut)= 0;
            virtual tThisRef operator&&(::Wiz::UTF16::String::InOut)= 0;
            virtual tThisRef operator&&(::Wiz::UTF32::String::InOut)= 0;

            virtual tThisRef operator&&(::Wiz::Byte::Ptr&)      = 0;
            ///===================================///
            virtual ::Wiz::USize32::Type CurrPos() = 0;
            virtual ::Wiz::Void::Type  MoveTo(::Wiz::USize32::In) = 0;
            ///===================================///
        };
        WIZ_DECLARE(::Wiz::Archive::Type);
        
        ::Wiz::Archive::Ptr CreateOutput(::Wiz::Accessor::Ptr);
        ::Wiz::Archive::Ptr CreateInput(::Wiz::Accessor::Ptr);

        ::Wiz::Archive::Ptr Create(::Wiz::Archive::Category::In, ::Wiz::Endian::In, ::Wiz::File::Ptr);
        ::Wiz::Archive::Ptr Create(::Wiz::Archive::Category::In, ::Wiz::Endian::In, ::Wiz::ByteBuffer::Ref);

        ::Wiz::Void::Type   Destory(::Wiz::Archive::Ptr);
    } /// end of namespace Archive
} /// end of namespace Wiz

#endif /*__WIZ_ARCHIVE_HPP__SHANHAOBO_19800429__*/
